package com.todo.component.hbase.service;

import java.util.List;
import java.util.Map;

/**
 * @author azhebuxing
 * @date 2025/1/9 11:39
 * @description
 */
public interface HBaseService {

    /**
     * 创建表
     *
     * @param tableName
     * @param columnFamily
     * @return
     */
    boolean creatTable(String tableName, List<String> columnFamily);

    /**
     * 预分区创建表
     *
     * @param tableName
     * @param columnFamily
     * @param splitKeys
     * @return
     */
    boolean createTableBySplitKeys(String tableName, List<String> columnFamily, byte[][] splitKeys);

    /**
     * 自定义获取分区splitKeys
     *
     * @param keys
     * @return
     */
    byte[][] getSplitKeys(String[] keys);

    /**
     * 获取所有表名
     *
     * @return
     */
    List<String> getAllTableNames();

    /**
     * 获取所有表数据-超级危险
     *
     * @param tableName
     * @return
     */
    @Deprecated
    Map<String, Map<String, String>> getResultScanner(String tableName);

    /**
     * 根据startRowKey和stopRowKey遍历查询指定表中的所有数据
     *
     * @param tableName
     * @param startRowKey
     * @param stopRowKey
     * @return
     */
    Map<String, Map<String, String>> getResultScanner(String tableName, String startRowKey, String stopRowKey);

    /**
     * 通过行前缀过滤器查询数据
     *
     * @param tableName
     * @param prefix
     * @return
     */
    Map<String, Map<String, String>> getResultScannerPrefixFilter(String tableName, String prefix);

    /**
     * 通过列前缀过滤器查询数据
     *
     * @param tableName
     * @param prefix
     * @return
     */
    Map<String, Map<String, String>> getResultScannerColumnPrefixFilter(String tableName, String prefix);

    /**
     * 通过行前缀和列前缀过滤器查询数据
     *
     * @param tableName 表名
     * @param column    列名
     * @param prefix    查询rowkey前缀
     * @return
     */
    Map<String, Map<String, String>> getResultScannerByColumnAndRowPrefixFilter(String tableName,String column, String prefix);

    /**
     * 查询行键中包含特定字符的数据
     *
     * @param tableName
     * @param keyword
     * @return
     */
    Map<String, Map<String, String>> getResultScannerRowFilter(String tableName, String keyword);

    /**
     * 查询列名中包含特定字符的数据
     *
     * @param tableName
     * @param keyword
     * @return
     */
    Map<String, Map<String, String>> getResultScannerQualifierFilter(String tableName, String keyword);

    /**
     * 根据tableName和rowKey精确查询一行的数据
     *
     * @param tableName
     * @param rowKey
     * @return
     */
    Map<String, String> getRowData(String tableName, String rowKey);

    /**
     * 根据tableName、rowKey、familyName、column查询指定单元格的数据
     *
     * @param tableName
     * @param rowKey
     * @param familyName
     * @param columnName
     * @return
     */
    String getColumnValue(String tableName, String rowKey, String familyName, String columnName);

    /**
     * 根据tableName、rowKey、familyName、column查询指定单元格多个版本的数据
     *
     * @param tableName
     * @param rowKey
     * @param familyName
     * @param columnName
     * @param versions
     * @return
     */
    List<String> getColumnValuesByVersion(String tableName, String rowKey, String familyName, String columnName, int versions);

    /**
     * 为表添加 or 更新数据 - 单数据
     *
     * @param tableName
     * @param rowKey
     * @param familyName
     * @param column
     * @param value
     */
    void putData(String tableName, String rowKey, String familyName, String column, String value);

    /**
     * 为表添加 or 更新数据 - 有TTL
     *
     * @param tableName
     * @param rowKey
     * @param familyName
     * @param column
     * @param value
     * @param ttl        ms
     */
    void putData(String tableName, String rowKey, String familyName, String column, String value, Long ttl);

    /**
     * 为表的某个单元格赋值
     *
     * @param tableName
     * @param rowKey
     * @param familyName
     * @param column1
     * @param value1
     */
    void setColumnValue(String tableName, String rowKey, String familyName, String column1, String value1);

    /**
     * 删除表的某个单元格
     *
     * @param tableName
     * @param rowKey
     * @param familyName
     * @param columnName
     * @return
     */
    boolean deleteColumn(String tableName, String rowKey, String familyName, String columnName);

    /**
     * 删除表的某行
     *
     * @param tableName
     * @param rowKey
     * @return
     */
    boolean deleteRow(String tableName, String rowKey);

    /**
     * 删除表的某列族
     *
     * @param tableName
     * @param columnFamily
     * @return
     */
    boolean deleteColumnFamily(String tableName, String columnFamily);

    /**
     * 删除表-danger
     *
     * @param tableName
     * @return
     */
    @Deprecated
    boolean deleteTable(String tableName);
}
